#主要包括搜索时用到的过滤器和查询器，优先使用过滤器
#term 过滤,要用于精确匹配哪些值
    { "term": { "age":    26           }}
    { "term": { "date":   "2014-09-01" }}
    { "term": { "public": true         }}
    { "term": { "tag":    "full_text"  }}

#terms 过滤，允许指定多个匹配条件
    {
        "terms": {
            "tag": [ "search", "full_text", "nosql" ]
            }
    }

#range 过滤,按照指定范围查找一批数据
    {
        "range": {
            "age": {
                "gte":  20,
                "lt":   30
            }
        }
    }

#exists 和 missing 过滤,是否包含指定字段或没有某个字段
    {
        "exists":   {
            "field":    "title"
        }
    }

#bool 过滤,以用来合并多个过滤条件查询结果的布尔逻辑
    #must :: 多个查询条件的完全匹配,相当于 and。
    #must_not :: 多个查询条件的相反匹配，相当于 not。
    #should :: 至少有一个查询条件匹配, 相当于 or。
    {
        "bool": {
            "must":     { "term": { "folder": "inbox" }},
            "must_not": { "term": { "tag":    "spam"  }},
            "should": [
                        { "term": { "starred": true   }},
                        { "term": { "unread":  true   }}
            ]
        }
    }

#match_all 查询,查询到所有文档，是没有查询条件下的默认语句

#match 查询,是一个标准查询，不管你需要全文本查询还是精确查询基本上都要用到它
    {
        "match": {
            "tweet": "About Search"
        }
    }

#multi_match 查询,允许你做match查询的基础上同时搜索多个字段
    {
        "multi_match": {
            "query":    "full text search",
            "fields":   [ "title", "body" ]
        }
    }

#bool 查询与 bool 过滤相似,于合并多个查询子句。不同的是，bool 过滤可以直接给出是否匹配成功， 而bool 查询要计算每一个查询子句的 _score
    #must:: 查询指定文档一定要被包含。
    #must_not:: 查询指定文档一定不要被包含。
    #should:: 查询指定文档，有则可以为文档相关性加分。
    {
        "bool": {
            "must": { "match": { "title": "how to make millions" }},
            "must_not": { "match": { "tag":   "spam" }},
            "should": [
                { "match": { "tag": "starred" }},
                { "range": { "date": { "gte": "2014-01-01" }}}
            ]
        }
    }
    # 如果bool 查询下没有must子句，那至少应该有一个should子句。但是 如果有must子句，那么没有should子句也可以进行查询

#查询与过滤条件的合并,search API中只能包含 query 语句
    {
        "query": {
            "filtered": {
                "query":  { "match": { "email": "business opportunity" }},
                "filter": { "term": { "folder": "inbox" }}
            }
        }
    }

#验证查询,validate API 可以验证一条查询语句是否合法
    GET /gb/tweet/_validate/query
    {
       "query": {
          "tweet" : {
             "match" : "really powerful"
          }
       }
    }

#理解错误信息,返回查询语句的验证结果信息
    GET /gb/tweet/_validate/query?explain
    {
       "query": {
          "tweet" : {
             "match" : "really powerful"
          }
       }
    }
    #explain 参数可以提供语句错误的更多详情

#相关性排序
    GET /_search
    {
        "query" : {
            "filtered" : {
                "filter" : { "term" : { "user_id" : 1 }}
            }
        },
        "sort": { "date": { "order": "desc" }}
    }

#字符查询也支持自定义排序，在查询字符串使用sort参数就可以
    GET /_search?sort=date:desc&sort=_score&q=search

#为多值字段排序，使用min, max, avg 或 sum这些模式
    "sort": {
        "dates": {
            "order": "asc",
            "mode":  "min"
        }
    }

#警告：对 analyzed 字段进行强制排序会消耗大量内存。 详情请查阅《字段类型简介》相关内容。

#文档是如何被匹配到的，会提示是否匹配到等信息
    GET /us/tweet/12/_explain
    {
       "query" : {
          "filtered" : {
             "filter" : { "term" :  { "user_id" : 2}},
             "query" :  { "match" : { "tweet" :   "honeymoon" }}
          }
       }
    }
